
import { useError, useLog } from '../console'
interface EventBus {
  [eventName: string]: (parameter: any) => void
}
const events: { [k in string]: EventBus } = {}
/**
 * csui事件总线
 * @param {string} moduleName 模块名称
 * @param {boolean} isDebug 是否显示调试信息
 * @returns bus对象
 * @example
 * // 传入模块初始化bus
 * const bus = useBus('propaganda')
 * // 注册事件
 * bus.on('change-event', () => {})
 * // 触发事件
 * bus.emit('change-event')
 * // 卸载事件
 * bus.off('change-event')
 */
const useBus = function (moduleName: string, isDebug: boolean) {
  const log = useLog('csui-use-bus', isDebug)
  const error = useError('csui-use-bus', isDebug)
  if (!events[moduleName]) {
    events[moduleName] = {}
  }

  return {
    /**
     * 执行方法
     * @param {string} eventName 方法名
     * @param {*} params 参数
     * @returns 方法返回的数据
     */
    emit: (eventName: string, params?: any) => {
      log('emit', moduleName, eventName, params)
      if (!events[moduleName][eventName]) {
        error(`csBus模块【${moduleName}】中未包含方法【${eventName}】`)
        return
      }
      return events[moduleName][eventName](params)
    },

    /**
     * 绑定方法
     * @param {string} eventName 方法名
     * @param {Function} function_ 方法, 支持async
     */
    on: (eventName: string, function_: EventBus[string]) => {
      log('on', moduleName, eventName)
      // log(`csBus模块【${moduleName}】中已包含方法【${eventName}】`)
      if (events[moduleName][eventName]) {
        error(`csBus模块【${moduleName}】中已包含方法【${eventName}】`)
      }
      events[moduleName][eventName] = function_
    },

    /**
     * 解绑方法
     * @param {string} eventName 方法名
     */
    off: (eventName: string) => {
      log('off', moduleName, eventName)
      delete events[moduleName][eventName]
    },

    /**
     * 清理该模块的注册事件
     */
    clean: () => {
      log('clean', moduleName)
      delete events[moduleName]
    }
  }
}

export { useBus }
